package com.agileboot.domain.common.utils;

import com.agileboot.common.core.page.AbstractQuery;
import com.agileboot.domain.system.dept.DeptApplicationService;
import com.agileboot.domain.system.dept.dto.DeptDTO;
import com.agileboot.infrastructure.user.AuthenticationUtils;
import com.agileboot.infrastructure.user.web.SystemLoginUser;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
import java.util.stream.Collectors;

public class DeptQueryUtils {

    private DeptQueryUtils() {
    }

    /**
     * 为查询添加当前用户及其子部门的过滤条件
     * @param query 查询对象
     * @param deptApplicationService 部门服务
     * @param <T> 实体类型
     * @return 添加了部门过滤条件的QueryWrapper
     */
    public static <T> QueryWrapper<T> addDeptCondition(AbstractQuery<T> query,
                                                       DeptApplicationService deptApplicationService) {
        SystemLoginUser loginUser = AuthenticationUtils.getSystemLoginUser();

        // 如果是管理员，直接返回原始查询条件
        if (loginUser.isAdmin()) {
            return query.toQueryWrapper();
        }

        Long deptId = loginUser.getDeptId();
        // 获取当前部门及其所有子部门
        List<DeptDTO> childDepts = deptApplicationService.getChildDepts(deptId);
        List<Long> deptIds = childDepts.stream()
                .map(DeptDTO::getId)
                .collect(Collectors.toList());
        deptIds.add(deptId); // 包含当前部门本身

        // 获取原始查询条件
        QueryWrapper<T> queryWrapper = query.toQueryWrapper();
        // 添加部门过滤条件
        queryWrapper.in("dept_id", deptIds);

        return queryWrapper;
    }
}